﻿
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;


/*
https://www.papamelon.com/problem/355


地图上有若干个城市（最多不超过 10 个，编号在 0∼9 之间）。
接着给出若干条城市之间的道路，道路是双向的，同时有一个数值表示道路长度。
现在让我们确定一个中心城市。从中心城市出发，分别求出它到其余每个城市的最短路径，
再将这些最短路径累计起来得到一个总和。
为了使得路径总和最小，我们要选择一个最优的中心城市。
输出中心城市的编号，以及它到其余所有城市的最短路径总和。
如果有多个中心城市的最短路径总和一样，输出编号最小的那个。

输入
多组测试数据
每组测试数据格式如下：
第一行是整数 n(1≤n≤45)，表示道路的数量
接下来 n 行，每行 3 个整数 u,v,w,(0≤u,v≤9,u≠v,0≤w≤100)，u,v 表示城市编号，w 表示道路长度
当 n=0 时表示输入结束（不用处理）
数据保证：给出的城市都是连通的；无重边，无自环
输出
每组测试数据输出一行，两个整数，分别表示城市编号和最短路径总和
样例 1
输入
6
0 1 80
1 2 20
0 2 60
2 3 50
3 4 60
1 4 90
2
0 1 1
1 2 1
0
输出
2 240
1 2
*/


const int N = 50;
int gra[N][N];
int n;
int cityNum = 0;

void floyd() {
	for (int k = 0; k <= cityNum; k++) {
		for (int i = 0; i <= cityNum; i++) {
			for (int j = 0; j <= cityNum; j++) {
				gra[i][j] = min(gra[i][j], gra[i][k] + gra[k][j]);
			}
		}
	}
}

int pathSum(int x) {
	int ret = 0;
	for (int i = 0; i <= cityNum; i++) {
		ret += gra[x][i];
	}
	return ret;
}


int main() {
	while (cin >> n) {
		if (n == 0) break;
		memset(gra, 0x3f, sizeof gra);

		for (int i = 0; i < 10; i++) { gra[i][i] = 0; }

		cityNum = 0;
		for (int i = 0; i < n; i++) {
			int a, b, w; cin >> a >> b >> w;
			cityNum = max(a, cityNum); cityNum = max(b, cityNum);
			gra[a][b] = w; gra[b][a] = w;
		}

		floyd();

		int ans = 0x3f3f3f3f; int ansx = -1;
		for (int i = 0; i <= cityNum; i++) {
			int sum = pathSum(i);
			if (ans > sum) {
				ans = sum; ansx = i;
			}
		}
		cout << ansx << " " << ans << endl;
	}

	return 0;
}